package com.c2b.algorithm.leetcode.base;

/**
 * <a href='https://leetcode.cn/problems/check-if-every-row-and-column-contains-all-numbers/'>检查是否每一行每一列都包含全部整数(Check if Every Row and Column Contains All Numbers)</a>
 * <p>对一个大小为 n x n 的矩阵而言，如果其每一行和每一列都包含从 1 到 n 的 全部 整数（含 1 和 n），则认为该矩阵是一个 有效 矩阵。</p>
 * <p>给你一个大小为 n x n 的整数矩阵 matrix ，请你判断矩阵是否为一个有效矩阵：如果是，返回 true ；否则，返回 false 。</p>
 *
 * <p>
 * <b>示例：</b>
 * <pre>
 * 示例 1：
 *      输入：matrix = [[1,2,3],[3,1,2],[2,3,1]]
 *      输出：true
 *      解释：在此例中，n = 3 ，每一行和每一列都包含数字 1、2、3 。
 *          因此，返回 true 。
 *
 * 示例 2：
 *      输入：matrix = [[1,1,1],[1,2,3],[1,2,3]]
 *      输出：false
 *      解释：在此例中，n = 3 ，但第一行和第一列不包含数字 2 和 3 。
 *          因此，返回 false 。
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 * <ul>
 *     <li>n == matrix.length == matrix[i].length</li>
 *     <li>1 <= n <= 100</li>
 *     <li>1 <= matrix[i][j] <= n</li>
 * </ul>
 * </p>
 *
 * @author c2b
 * @since 2024/1/19 11:01
 */
public class LC2133CheckIfEveryRowAndColumnContainsAllNumbers_S {

    static class Solution {
        public boolean checkValid(int[][] matrix) {
            int length = matrix.length;
            // 校验每一行
            for (int[] rows : matrix) {
                boolean[] colStates = new boolean[length];
                for (int col = 0; col < length; ++col) {
                    if (colStates[rows[col] - 1]) {
                        return false;
                    }
                    colStates[rows[col] - 1] = true;
                }
            }
            // 校验每一列
            for (int col = 0; col < length; ++col) {
                boolean[] rowStates = new boolean[length];
                for (int[] rows : matrix) {
                    if (rowStates[rows[col] - 1]) {
                        return false;
                    }
                    rowStates[rows[col] - 1] = true;
                }
            }
            return true;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.checkValid(new int[][]{
                {1, 2, 3},
                {3, 1, 2},
                {2, 3, 1}
        }));
        System.out.println(solution.checkValid(new int[][]{
                {1, 1, 1},
                {1, 2, 3},
                {1, 2, 3}
        }));
    }
}
